package cn.yesway.springioc.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassReflectUtil {
	
	/**
	 * 根据类名反射创建对象
	 * @param name 类名
	 * @return 对象
	 * @throws Exception
	 */
	public static Object getInstance(String classname) throws Exception {
		/**
		 * 获取Class<?> clazz的方法
		 * 第一种方式
		 * ClassLoader loader = Thread.currentThread().getContextClassLoader();
		 * Class<?> clazz = loader.loadClass(classname);
		 * 
		 */
		
		Class<?> clazz = Class.forName(classname);
		/**
		 * 实例化的方法
		 * 第一种
		 *   Constructor cons = clazz .getDeclaredConstructor((Class[]) null) ;
         *   Object obj= cons .newInstance(); 
		 */
		
		Object obj=clazz.newInstance();
		
		return  obj;
	}
	
	/**
	 * 反射调用对象的方法
	 * @param obj 对象 
	 * @param methodName  方法名称 
	 * @param paramType 参数类型    new Class[]{int.class,double.class}
	 * @param params 参数值     new Object[]{2,3.5}
	 * @return
	 * @throws Exception 
	 */
	public static Object executeMethod(Object obj,String methodName,Class<?>[] paramTypes,Object[] params) throws  Exception{
		//发现类型
		Class<?> cls = obj.getClass();
		//发现方法
		Method method = cls.getDeclaredMethod(methodName, paramTypes);
		//访问方法时,压制Java对访问修饰符的检查
		method.setAccessible(true);
		Object val = method.invoke(obj, params);
		return val;
	}
	
	/**
	 * 反射给对象的某个属性赋值
	 * @param obj 对象
	 * @param fieldName 字段名称
	 * @param fieldValue  赋的值
	 * @throws Exception
	 */
	public static void setFieldValue(Object obj,String fieldName,String fieldValue) throws  Exception{
		//发现类型
		 Class<?> cls = obj.getClass();
		 Field fld = cls.getDeclaredField(fieldName);
	        //①取消Java语言访问检查以访问private变量
		 fld.setAccessible(true); 
		 fld.set(obj,fieldValue);
	}
}
